-- xmake.lua for NASM project
local image = "hd.img"

-- 自定义规则：汇编文件编译
rule("asm")
do
  set_extensions(".asm", ".s")

  on_build_file(function(target, sourcefile, opt)
    print("sourcefile: %s", sourcefile)
    -- 获取源文件相对路径，用于保持目录结构，不要 src
    local relpath = path.relative(sourcefile, "src")
    local obj = path.join("$(buildir)", path.directory(relpath), path.basename(sourcefile) .. ".bin")
    local lst = path.join("$(buildir)", path.directory(relpath), path.basename(sourcefile) .. ".lst")
    -- 确保目标目录存在
    os.mkdir(path.directory(obj))
    -- 编译汇编文件
    os.run("nasm %s -o %s -l %s", sourcefile, obj, lst)
  end)

  on_clean(function(target)
    os.rm("$(buildir)")
  end)
end
rule_end()

target("compile", function()
  set_kind("object")
  add_files("src/**.asm")
  add_rules("asm")
end)

-- 主目标：构建硬盘镜像
target("hdimg", function()
  set_kind("phony")
  add_deps("compile")

  on_build(function(target)
    print("Image on build")
    -- 删除旧的镜像文件
    if os.isfile(image) then
      os.rm(image)
    end
    -- 创建新的硬盘镜像
    os.exec("bximage -q -hd=16 -func=create -sectsize=512 -imgmode=flat %s", image)
    os.exec("dd if=build/boot/boot.bin of=%s bs=512 seek=0 count=1 conv=notrunc", image)
    print("写入 image 完成.")
  end)

  on_clean(function(target)
    -- 清理时删除镜像文件
    if os.isfile(image) then
      os.rm(image)
    end
  end)
end)

-- Bochs 模拟器目标
target("bochs", function()
  set_kind("phony")
  set_default(true)
  add_deps("hdimg") -- 依赖 hdimg 目标

  on_build(function(target)
    os.exec("bochs -q -f bochsrc")
  end)
end)
